package com.emn.fil.iapoker.dto;

import java.util.ArrayList;
import java.util.HashMap;

import org.apache.log4j.Logger;

public class Table {
	
	Logger logger = Logger.getLogger(this.getClass());

	private ArrayList<Joueur> listeJoueur;
	
	private int curJoueur;
	
	private Partie partie;
	
	private Joueur lastJoueurToTalk;
	
	public Table() {
		
		listeJoueur = new ArrayList<Joueur>();
		
	}
	
	public void setPartie(Partie partie) {
		this.partie = partie;
	}
	
	public void ajouterJoueur(Joueur joueur) {
		
		listeJoueur.add(joueur);
		
	}
	
	public String toString() {
		int i = 1;
		String retour = "";
		for(Joueur joueur : listeJoueur) {
			retour += i + ". " + joueur + " (" + joueur.getStack() + " points) " + ((i-1)==curJoueur?"(Current Joueur)":"") + "\n";
			i++;
		}
		return retour;
	}
	
	public int nbJoueurs() {
		int nb = 0;
		for(int i = 0;i<listeJoueur.size();i++) {
			if(joueurOk(i))
				nb++;
		}
		return nb;
	}
	
	public ArrayList<Joueur> getJoueurs() {
		return listeJoueur;
	}
	
	public void setCurJoueur(int curJoueur) {
		if(curJoueur == 0)
			this.curJoueur = listeJoueur.size()-1;
		else
			this.curJoueur = curJoueur-1;
		nextJoueur();
	}
	
	public void nextJoueur() {
		
		for(int i = curJoueur+1;i<listeJoueur.size();i++) {
			if(joueurOk(i)) {
				logger.trace("1.CurJoueur : " + curJoueur + " | Joueur actuel: " + i);
				curJoueur = i;
				return;
			}
		}
		
		for(int i = 0;i<curJoueur;i++) {
			if(joueurOk(i)) {
				logger.trace("2.CurJoueur : " + curJoueur + " | Joueur actuel: " + i);
				curJoueur = i;
				return;
			}
		}
		
	}
	
	public Joueur getCurJoueur() {
		return listeJoueur.get(curJoueur);
	}
	
	public Joueur getJoueur(int id) {
		
		id = id%listeJoueur.size();
		
		for(int i = id;i<listeJoueur.size();i++) {
			if(joueurOk(i)) {
				//logger.warn("PrevCurJoueur : " + prevCurJoueur + " | Joueur : " + i);
				return listeJoueur.get(i);
			}
		}
		
		for(int i = 0;i<id;i++) {
			if(joueurOk(i)) {
				//logger.warn("2PrevCurJoueur : " + prevCurJoueur + " | Joueur : " + i);
				return listeJoueur.get(i);
			}
		}
		
		return null;
		
	}
	
	public Joueur getPrevJoueur() {

		for(int i = curJoueur-1;i>=0;i--) {
			if(joueurOk(i)) {
				//logger.warn("PrevCurJoueur : " + prevCurJoueur + " | Joueur : " + i);
				return listeJoueur.get(i);
			}
		}
		
		for(int i = (listeJoueur.size()-1);i>curJoueur;i--) {
			if(joueurOk(i)) {
				//logger.warn("2PrevCurJoueur : " + prevCurJoueur + " | Joueur : " + i);
				return listeJoueur.get(i);
			}
		}
		
		return null;
		
	}

	private boolean joueurOk(int i) {
		
		Joueur curJoueur = listeJoueur.get(i);
		
		boolean stackOk = curJoueur.getStack() > 0;
		
		boolean totaleMiseOk = partie.getTotaleMise(curJoueur) > 0;
		
		boolean hasFold = partie.hasFold(curJoueur);
		
		logger.trace("Joueur " + listeJoueur.get(i) + " (" + i + ") Ok ? StackOk : " + stackOk + " | totaleMiseOk " + totaleMiseOk + " | hasFold : " + hasFold);
		
		return (stackOk || totaleMiseOk) && !hasFold;
	}
	
	/*
	 * Retourne tous les joueurs OK
	 */
	public Joueur[] getLastJoueurs() {
		Joueur[] joueurs = new Joueur[listeJoueur.size()];
		int j = 0;
		
		for(int i = 0;i<listeJoueur.size();i++) {
			if(joueurOk(i)) {
				joueurs[j] = listeJoueur.get(i);
				j++;
			}
		}
		return joueurs;
	}

	public Joueur getLastJoueurToTalk() {
		
		Joueur[] joueurs = getLastJoueurs();
		
		boolean found = false;
		
		for(Joueur joueur : joueurs) {
			if(joueur == lastJoueurToTalk)
				found = true;
		}
		
		if(!found) {
			lastJoueurToTalk = getPrevJoueur();
		}
		
		return lastJoueurToTalk;
	}

	public void setLastJoueurToTalk(Joueur lastJoueurToTalk) {
		this.lastJoueurToTalk = lastJoueurToTalk;
	}
}
